package org.xin.framework.base.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.xin.common.result.Result;

/**
 * @author Long
 * @version 1.0
 * @description:
 * @remarks: 使用注意添加注解：@Aspect @Component
 * @title BaseAspect
 * @date 2021/5/16 13:56
 */
public abstract class IBaseAspect {
    protected ThreadLocal<Long> currentTime = new ThreadLocal<>();
    
    /**
     * @description: 设置操作日志切入点 记录操作日志 在注解的位置切入代码
     * @remarks: 该方法无方法体,主要为了让同类中其他方法使用此切入点
     * 需添加注解例如： @Pointcut("@annotation(切入点)")
     * @author Long 
     * @date 2021/5/16 14:02 
     */
    public abstract void aspect() ;

    /**
     * @description: 
     * @remarks: 需要添加注解 @Before("aspect()")
     * @author Long 
     * @date 2021/5/16 14:01 
     */
    public abstract void doBefore(JoinPoint jp);


    /**
     * @description: 需要添加注解 @Around("aspect()")
     * @remarks:
     * @author Long
     * @date 2021/5/24 16:05
     */
    public abstract Object around(ProceedingJoinPoint pjp, JoinPoint jp) throws Throwable;

    /**
     * @description: 
     * @remarks: 需要添加注解 @After("aspect()")
     * @author Long
     * @date 2021/5/16 14:02 
     */
    public abstract void doAfter(JoinPoint jp);

    /**
     * @description:
     * @remarks: 需要添加注解 @AfterReturning(returning = "result", pointcut = "aspect()")
     * @author Long
     * @date 2021/5/16 14:03 
     */
    public abstract void doAfterRuturn(JoinPoint jp, Result result);
}
